﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HerGoS.Viaticos.Entities;
using HerGoS.DAO;
using HerGoS.Interfaces;
using System.Data;
using HerGoS.Viaticos.Exceptions;
using HerGoS.Administration.Engine;
using HerGoS.Administration.Entities;

namespace HerGoS.Viaticos.Engine
{
    public class GestorTransporte
    {
        public static Transporte Obtener(int oid)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
                repo.Nombre = "TTIPOTRANSPORTE_SP";
                repo.AddParameter("@ACCION", "BYID");
                repo.AddParameter("@ID", oid);
                DataTable dt = repo.ExecuteDataTable();
              Transporte result = dt.ToGenericList<Transporte>(TransporteConverter).FirstOrDefault();
                return result;
            }
            catch (Exception ex)
            {
                throw new TransporteGetException(ex);
            }
        }

        public static List<Transporte> Consultar()
        {
            return Consultar(null, null, true);
        
        }

        public static List<Transporte> Consultar(string codigo, string descripcion, bool? activo)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
                repo.Nombre = "TTIPOTRANSPORTE_SP";
                repo.AddParameter("@ACCION", "CONSULTA");
                repo.AddParameter("@ID", null);
                repo.AddParameter("@CODIGO", codigo);
                repo.AddParameter("@DESCRIPCION", descripcion);
                repo.AddParameter("@ACTIVO", activo);
                DataTable dt = repo.ExecuteDataTable();
                List<Transporte> result = dt.ToGenericList<Transporte>(TransporteConverter);
                return result;
            }
            catch (Exception ex)
            {
                throw new TransporteGetException(ex);
            }
        }


        public static bool ExisteTransporte(string codigo)
        {
            try
            {
                IRepository repo = RepositoryFactory.Create(Config.RepositoryViaticosName);
                repo.Nombre = "TTIPOTRANSPORTE_SP";
                repo.AddParameter("@ACCION", "EXIST");
                repo.AddParameter("@CODIGO", codigo);
                repo.AddParameter("@DESCRIPCION", null);
                repo.AddParameter("@ACTIVO", true);
                int res  = repo.ExecuteScalar().ToInteger();
                
                return res > 0;
            }
            catch (Exception ex)
            {
                throw new TransporteGetException(ex);
            }
        }






        public static void Guardar(Transporte transporte)
        {
            try
            {
                IRepository repo = RepositoryFactory.CreateTransactional(Config.RepositoryViaticosName);
                repo.Nombre = "TTIPOTRANSPORTE_PROC";
                repo.AddParameter("@ACCION ", transporte.Persistencia);
                repo.AddParameter("@ID", transporte.OID);
                repo.AddParameter("@CODIGO", transporte.Codigo);
                repo.AddParameter("@DESCRIPCION", transporte.Descripcion);
                repo.AddParameter("@CONPASAJE", transporte.CONPASAJE);
                repo.AddParameter("@CALCULOKMS", transporte.CALCULOKMS);
                repo.AddParameter("@IDUSUARIO", HGSContext.Usuario.OID);
                transporte.OID = repo.ExecuteReturnValue().ToInteger();
                repo.Commit();

                GestorBitacora.Guardar(transporte);
            }
            catch (Exception ex)
            {
                throw new TransporteSaveException(ex);
            }
        }

        public static void Eliminar(Transporte transporte)
        {
            transporte.Persistencia = EstadoPersistencia.DELETE;
            Guardar(transporte);
            transporte.Persistencia = EstadoPersistencia.UPDATE;
            transporte.Activo = false;
        }


        public static void ReActivar(Transporte transporte)
        {
            transporte.Persistencia = EstadoPersistencia.UNDELETE;
            Guardar(transporte);
            transporte.Persistencia = EstadoPersistencia.UPDATE;
            transporte.Activo = true;
        }
        

        #region Converter
        public static Transporte TransporteConverter(DataRow row)
        {
            return new Transporte
            {
                OID = row["tranID"].ToInteger(),
                Codigo = row["tranCODIGO"].ToString(),
                Descripcion = row["tranDESCRIPCION"].ToString(),
                CONPASAJE = row["tranCONPASAJE"].ToBoolean(),
                CALCULOKMS = row["tranCALCULOKMS"].ToBoolean(),
                Activo = row.IsNull("FECHA_BAJA") ? true : false
            };
        }
        #endregion

    }
}
